//package net.chips.android.plugin.outmanage.kt
//
//import androidx.lifecycle.ViewModel
//import androidx.lifecycle.viewModelScope
//import com.chips.basemodule.model.BaseFailData
//import com.chips.basemodule.model.SuperBaseModel
//import com.chips.cpsui.dialog.CpsLoadingDialog
//import com.chips.cpsui.utils.CpsToastUtils
//import com.dgg.library.bean.BaseData
//import com.google.gson.Gson
//import com.google.gson.JsonArray
//import com.google.gson.JsonObject
//import kotlinx.coroutines.*
//import net.chips.android.plugin.outmanage.utils.ErrorUtil
//
//import net.dgg.dggutil.ActivityUtils
//import okhttp3.RequestBody.Companion.toRequestBody
//import kotlin.coroutines.CoroutineContext
//import kotlin.coroutines.EmptyCoroutineContext
//
//
///**
// * @author Administrator
// * Created by dab on 2021/6/10 14:44
// */
//
//
///**
// * block:可以执行耗时操作
// * error:当上面操作发生异常的时候,比如网络错误,比如空指针等等
// * before:任务开始之前调用,比如显示弹窗等初始化,默认为空,什么都不做
// * complete:任务完成的时候调用,比如关闭弹窗,释放资源等,一定会调用
// * context:协程上下文,默认使用之前调用者的
// */
//private fun ViewModel.run(
//    block: suspend CoroutineScope.() -> Unit,
//    error: suspend (BaseFailData) -> Unit,
//    before: suspend CoroutineScope.() -> Unit = {},
//    complete: suspend () -> Unit = {},
//    context: CoroutineContext = EmptyCoroutineContext,
//): Job {
//    return viewModelScope.launch(context) {
//        try {
//            before()
//            block()
//        } catch (e: Exception) {
//            error(ErrorUtil.getErrorData(e))
//            e.printStackTrace()
//        } finally {
//            withContext(NonCancellable) {
//                complete()
//            }
//        }
//    }
//
//}
//
///**
// * block:需要运行的代码块
// * error:运行出错,比如网络错误等等错误,不填会默认一个错误提示的弹窗
// * loadingDialog:运行的的loading,默认有一个不可取消弹窗,当发生错误或者运行完成后自动取消弹窗
// * loadingMsg:loadingDialog加载的时候显示的文字,默认加载中
// *
// * return Job:协程的操作,可以判断这个请求的请求状态,还可以进行取消这个请求
// */
//fun ViewModel.request(
//    block: suspend CoroutineScope.() -> Unit,
//    error: suspend (BaseFailData) -> Unit = {
//        CpsToastUtils.showError(it.message)
//    },
//    loadingDialog: CpsLoadingDialog? = defLoadingDialog(),
//    loadingMsg: String? = ""
//): Job {
//    return run(block, {
//        withContext(Dispatchers.Main) {
//            error.invoke(it)
//        }
//    }, {
//        withContext(Dispatchers.Main) {
//            if (loadingMsg.isNullOrEmpty()) {
//                loadingDialog?.show()
//            } else {
//                loadingDialog?.show(loadingMsg, false)
//            }
//        }
//    }, {
//        withContext(Dispatchers.Main) {
//            loadingDialog?.dismiss()
//        }
//    }, Dispatchers.Default + CoroutineName("request"))
//}
//
///**
// * block:当响应码(服务器定义的)正确(默认200)的时候,回调出BaseData里面的message
// * err:当响应码不正确(默认200)的时候,回调出BaseFailData,里面code和message,就是服务器返回的code和message,默认弹窗提示错误
// * successCode:不定参数,可以填写多个自定义正确响应码,如果填写后,block和err 会使用填写的响应码 默认200
// */
//fun <T : Any?> BaseData<T>.succeedMessage(
//    block: suspend (String) -> Unit,
//    err: (suspend (BaseFailData) -> Unit)? = null,
//    vararg successCode: Int = intArrayOf(200),
//) {
//    GlobalScope.launch(Dispatchers.Main) {
//        if (this@succeedMessage.isSuccess(successCode = successCode)) {
//            block.invoke(this@succeedMessage.message)
//        } else {
//            if (err != null) {
//                err.invoke(BaseFailData(this@succeedMessage.code, this@succeedMessage.message))
//            } else {
//                CpsToastUtils.showError(this@succeedMessage.message)
//            }
//        }
//    }
//}
//
///**
// * block:当响应码(服务器定义的)正确(默认200)的时候,回调出BaseData里面的data
// * err:当响应码不正确(默认200)的时候,回调出BaseFailData,里面code和message,就是服务器返回的code和message,默认弹窗提示错误
// * successCode:不定参数,可以填写多个自定义正确响应码,如果填写后,block和err 会使用填写的响应码 默认200
// */
//fun <T : Any?> BaseData<T>.succeedData(
//    block: suspend (T) -> Unit,
//    err: (suspend (BaseFailData) -> Unit)? = null,
//    vararg successCode: Int = intArrayOf(200),
//) {
//    GlobalScope.launch(Dispatchers.Main) {
//        if (this@succeedData.isSuccess(successCode = successCode)) {
//            block.invoke(this@succeedData.data)
//        } else {
//            if (err != null) {
//                err.invoke(BaseFailData(this@succeedData.code, this@succeedData.message))
//            } else {
//                CpsToastUtils.showError(this@succeedData.message)
//            }
//        }
//    }
//}
//
//private fun <T : Any?> BaseData<T>.isSuccess(vararg successCode: Int = intArrayOf(200)): Boolean {
//    for (element in successCode) {
//        if (this.code == element) {
//            return true
//        }
//    }
//    return false
//}
//
//fun defLoadingDialog(): CpsLoadingDialog {
//    val cpsLoadingDialog = CpsLoadingDialog(ActivityUtils.getTopActivity())
//    cpsLoadingDialog.setCancelable(false)
//    return cpsLoadingDialog
//}
//
//fun Map<String, Any>.toRequestBody() = Gson().toJson(this).toRequestBody()
//
//inline fun <T> Map<String, T>.toJsonArray(block: (T) -> JsonObject): JsonArray {
//    val json = JsonArray()
//    for ((_, b) in this) {
//        json.add(block.invoke(b))
//    }
//    return json
//}
